package com.billdowney.service.util.system;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import com.billdowney.entity.system.SystemDataDict;
import com.billdowney.service.util.project.SystemAppConst;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

/**
 * @Description: 数据字典工具类
 * @author: 唐路钧
 * @date: 2018年9月8日 下午2:43:57
 */
@Component
public class SystemDataDictUtil {

	@Value(SystemAppConst.dataDictFilepathValue)
	private Resource resource;

	private Map<String, SystemDataDict> data;

	@PostConstruct
	public void init() {
		data = getSystemDataDictData();
	}

	/**
	 * 通过Key来获取文件中的数据
	 * 
	 * @param key 获取的Key
	 * @return 读取的数据
	 * @author: 唐路钧
	 * @date: 2019年1月10日 上午11:40:12
	 */
	public SystemDataDict get(String key) {
		return data.get(key);
	}

	/**
	 * 获取组装过后的json文件数据
	 * 
	 * @return
	 * @author: 唐路钧
	 * @date: 2019年1月10日 上午11:27:34
	 */
	public Map<String, SystemDataDict> getSystemDataDictData() {
		Map<String, SystemDataDict> map = new HashMap<>();
		JSONObject json = getJson();
		for (String key : json.keySet()) {
			try {
				map.put(key, json.getBean(key, SystemDataDict.class));
			} catch (Exception e) {
				map.put(key, new SystemDataDict());
			}
		}
		return map;
	}

	/**
	 * 获取json数据
	 * 
	 * @return
	 * @author: 唐路钧
	 * @date: 2019年1月10日 上午11:29:20
	 */
	public JSONObject getJson() {
		StringBuffer message = new StringBuffer();
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()));
			String line = null;
			while ((line = br.readLine()) != null) {
				message.append(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			return JSONUtil.parseObj(message.toString());
		} catch (Exception e) {
			e.printStackTrace();
			return new JSONObject();
		}
	}

	public void setData(Map<String, SystemDataDict> data) {
		this.data = data;
	}

	public Map<String, SystemDataDict> getData() {
		return data;
	}

}
